home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Personal Computer World 2005 October
/
PCWOCT05.iso
/
Software
/
FromTheMag
/
XAMPP 1.4.14
/
xampp-win32-1.4.14-installer.exe
/
xampp
/
php
/
pear
/
Math
/
IntegerOp.php
< prev
next >
Wrap
PHP Script
|
2004-03-24
|
14KB
|
405 lines
<?php
//
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2002 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Authors: Jesus M. Castagnetto <jmcastagnetto@php.net> |
// +----------------------------------------------------------------------+
//
// $Id: IntegerOp.php,v 1.1 2003/01/02 01:55:05 jmcastagnetto Exp $
//
include_once 'Math/Integer.php';
/**
* Class implementing operations on Math_Integer objects. If available it
* will use the GMP or BCMATH libraries. Will default to the standard PHP
* integer representation otherwise.
*
* The operations are implemented as static methods of the class.
*
* @author Jesus M. Castagnetto <jmcastagnetto@php.net>
* @version 0.8
* @access public
* @package Math_Integer
*/
class Math_IntegerOp {/*{{{*/
/**
* Checks if the given parameter is a Math_Integer object
*
* @param object Math_Integer $int1
* @return boolean TRUE if parameter is an instance of Math_Integer, FALSE otherwise
* @access public
*/
function isMath_Integer(&$int) {/*{{{*/
if (function_exists('is_a')) {
return is_a($int, 'Math_Integer');
} else {
return get_class($int) == 'math_integer'
|| is_subclass_of($int, 'math_integer');
}
}/*}}}*/
/**
* Add two Math_Integer objects: $i1 + $i2
*
* @param object Math_Integer $int1
* @param object Math_Integer $int2
* @return object Math_Integer on success, PEAR_Error otherwise
* @access public
*/
function &add(&$int1, &$int2) {/*{{{*/
if (PEAR::isError($err = Math_IntegerOp::_validInts($int1, $int2))) {
return $err;
}
switch (MATH_INTLIB) {/*{{{*/
case 'gmp' :
$tmp = gmp_strval(gmp_add($int1->getValue(), $int2->getValue()));
break;
case 'bcmath' :
$tmp = bcadd($int1->getValue(), $int2->getValue());
break;
case 'std' :
$tmp = $int1->getValue() + $int2->getValue();
break;
}/*}}}*/
return new Math_Integer($tmp);
}/*}}}*/
/**
* Substract two Math_Integer objects: $i1 - $i2
*
* @param object Math_Integer $int1
* @param object Math_Integer $int2
* @return object Math_Integer on success, PEAR_Error otherwise
* @access public
*/
function &sub(&$int1, &$int2) {/*{{{*/
if (PEAR::isError($err = Math_IntegerOp::_validInts($int1, $int2))) {
return $err;
}
switch (MATH_INTLIB) {/*{{{*/
case 'gmp' :
$tmp = gmp_strval(gmp_sub($int1->getValue(), $int2->getValue()));
break;
case 'bcmath' :
$tmp = bcsub($int1->getValue(), $int2->getValue());
break;
case 'std' :
$tmp = $int1->getValue() - $int2->getValue();
break;
}/*}}}*/
return new Math_Integer($tmp);
}/*}}}*/
/**
* Multiply two Math_Integer objects: $i1 * $i2
*
* @param object Math_Integer $int1
* @param object Math_Integer $int2
* @return object Math_Integer on success, PEAR_Error otherwise
* @access public
*/
function &mul(&$int1, &$int2) {/*{{{*/
if (PEAR::isError($err = Math_IntegerOp::_validInts($int1, $int2))) {
return $err;
}
switch (MATH_INTLIB) {/*{{{*/
case 'gmp' :
$tmp = gmp_strval(gmp_mul($int1->getValue(), $int2->getValue()));
break;
case 'bcmath' :
$tmp = bcmul($int1->getValue(), $int2->getValue());
break;
case 'std' :
$tmp = $int1->getValue() * $int2->getValue();
break;
}/*}}}*/
return new Math_Integer($tmp);
}/*}}}*/
/**
* Divide two Math_Integer objects: $i1 / $i2
*
* @param object Math_Integer $int1
* @param object Math_Integer $int2
* @return object Math_Integer on success, PEAR_Error otherwise
* @access public
*/
function &div(&$int1, &$int2) {/*{{{*/
if (PEAR::isError($err = Math_IntegerOp::_validInts($int1, $int2))) {
return $err;
}
switch (MATH_INTLIB) {/*{{{*/
case 'gmp' :
$tmp = gmp_strval(gmp_div($int1->getValue(), $int2->getValue()));
break;
case 'bcmath' :
$tmp = bcdiv($int1->getValue(), $int2->getValue());
break;
case 'std' :
$tmp = intval($int1->getValue() / $int2->getValue());
break;
}/*}}}*/
return new Math_Integer($tmp);
}/*}}}*/
/**
* Calculate the modulus of $i1 and $i2: $i1 % $i2
*
* @param object Math_Integer $int1
* @param object Math_Integer $int2
* @return object Math_Integer on success, PEAR_Error otherwise
* @access public
*/
function &mod(&$int1, &$int2) {/*{{{*/
if (PEAR::isError($err = Math_IntegerOp::_validInts($int1, $int2))) {
return $err;
}
switch (MATH_INTLIB) {/*{{{*/
case 'gmp' :
$tmp = gmp_strval(gmp_mod($int1->getValue(), $int2->getValue()));
break;
case 'bcmath' :
$tmp = bcmod($int1->getValue(), $int2->getValue());
break;
case 'std' :
$tmp = $int1->getValue() % $int2->getValue();
break;
}/*}}}*/
return new Math_Integer($tmp);
}/*}}}*/
/**
* Raise $i1 to the $i2 exponent: $i1^$i2
*
* @param object Math_Integer $int1
* @param object Math_Integer $int2
* @return object Math_Integer on success, PEAR_Error otherwise
* @access public
*/
function &pow(&$int1, &$int2) {/*{{{*/
if (PEAR::isError($err = Math_IntegerOp::_validInts($int1, $int2))) {
return $err;
}
switch (MATH_INTLIB) {/*{{{*/
case 'gmp' :
$tmp = gmp_strval(gmp_pow($int1->getValue(), (int) $int2->toString()));
break;
case 'bcmath' :
$tmp = bcpow($int1->getValue(), $int2->getValue());
break;
case 'std' :
$tmp = pow($int1->getValue(), $int2->getValue());
break;
}/*}}}*/
return new Math_Integer($tmp);
}/*}}}*/
/**
* Compare two Math_Integer objects.
* if $i1 > $i2, returns +1,
* if $i1 == $i2, returns +0,
* if $i1 < $i2, returns -1,
*
* @param object Math_Integer $int1
* @param object Math_Integer $int2
* @return mixed and integer on success, PEAR_Error otherwise
* @access public
* @see Math_IntegerOp::sign
*/
function &compare(&$int1, &$int2) {/*{{{*/
if (PEAR::isError($err = Math_IntegerOp::_validInts($int1, $int2))) {
return $err;
}
switch (MATH_INTLIB) {/*{{{*/
case 'gmp' :
$cmp = gmp_cmp($int1->getValue(), $int2->getValue());
break;
case 'bcmath' :
$cmp = bccomp($int1->getValue(), $int2->getValue());
break;
case 'std' :
$cmp = $int1->getValue() - $int2->getValue();
break;
}/*}}}*/
return Math_IntegerOp::sign(new Math_Integer($cmp));
}/*}}}*/
/**
* Returns the sign of a Math_Integer number
* if $i1 > 0, returns +1,
* if $i1 == 0, returns +0,
* if $i1 < 0, returns -1,
*
* @param object Math_Integer $int1
* @return mixed and integer on success, PEAR_Error otherwise
* @access public
*/
function &sign(&$int1) {/*{{{*/
if (PEAR::isError($err = Math_IntegerOp::_validInt($int1))) {
return $err;
}
switch (MATH_INTLIB) {/*{{{*/
case 'gmp' :
return gmp_sign($int1->getValue());
break;
case 'bcmath' :
case 'std' :
$tmp = $int1->getValue();
if ($tmp > 0) {
return 1;
} elseif ($tmp < 0) {
return -1;
} else { // $tmp == 0
return 0;
}
break;
}/*}}}*/
}/*}}}*/
/**
* Returns the negative of a Math_Integer number: -1 * $i1
*
* @param object Math_Integer $int1
* @return object Math_Integer on success, PEAR_Error otherwise
* @access public
*/
function &neg(&$int1) {/*{{{*/
if (PEAR::isError($err = Math_IntegerOp::_validInt($int1))) {
return $err;
}
switch (MATH_INTLIB) {/*{{{*/
case 'gmp' :
$tmp = gmp_strval(gmp_neg($int1->getValue()));
break;
case 'bcmath' :
$tmp = bcmul(-1, $int1->getValue());
break;
case 'std' :
$tmp = -1 * $int1->getValue();
break;
}/*}}}*/
return new Math_Integer($tmp);
}/*}}}*/
/**
* Returns the (integer) square root of a Math_Integer number
*
* @param object Math_Integer $int1
* @return object Math_Integer on success, PEAR_Error otherwise
* @access public
*/
function &sqrt(&$int1) {/*{{{*/
if (PEAR::isError($err = Math_IntegerOp::_validInt($int1))) {
return $err;
}
switch (MATH_INTLIB) {/*{{{*/
case 'gmp' :
$tmp = gmp_strval(gmp_sqrt($int1->getValue()));
break;
case 'bcmath' :
$tmp = bcsqrt(-1, $int1->getValue());
break;
case 'std' :
$tmp = intval(sqrt($int1->getValue()));
break;
}/*}}}*/
return new Math_Integer($tmp);
}/*}}}*/
/**
* Returns the absolute value of a Math_Integer number
*
* @param object Math_Integer $int1
* @return object Math_Integer on success, PEAR_Error otherwise
* @access public
*/
function &abs(&$int1) {/*{{{*/
if (PEAR::isError($err = Math_IntegerOp::_validInt($int1))) {
return $err;
}
switch (MATH_INTLIB) {/*{{{*/
case 'gmp' :
$tmp = gmp_strval(gmp_abs($int1->getValue()));
break;
case 'bcmath' :
if ($int1->getValue() < 0) {
$tmp = bcmul(-1, $int1->getValue());
} else {
$tmp = $int1->getValue();
}
break;
case 'std' :
$tmp = abs($int1->getValue());
break;
}/*}}}*/
return new Math_Integer($tmp);
}/*}}}*/
/**
* Checks that the 2 passed objects are valid Math_Integer numbers.
* The objects must be instances of Math_Integer and have been properly
* initialized.
*
* @param object Math_Integer $int1
* @param object Math_Integer $int2
* @return mixed TRUE if both are Math_Integer objects, PEAR_Error otherwise
* @access private
*/
function _validInts(&$int1, &$int2) {/*{{{*/
$err1 = Math_IntegerOp::_validInt($int1);
$err2 = Math_IntegerOp::_validInt($int2);
$error = '';
if (PEAR::isError($err1)) {
$error .= 'First parameter: '.$err1->getMessage();
}
if (PEAR::isError($err2)) {
$error .= ' Second parameter: '.$err2->getMessage();
}
if (!empty($error)) {
return PEAR::raiseError($error);
} else {
return true;
}
}/*}}}*/
/**
* Checks that the passed object is a valid Math_Integer number.
* The object must be an instance of Math_Integer and have been properly
* initialized.
*
* @param object Math_Integer $int1
* @return mixed TRUE if is a Math_Integer object, PEAR_Error otherwise
* @access private
*/
function _validInt(&$int1) {/*{{{*/
$error = '';
if (!Math_IntegerOp::isMath_Integer($int1)) {
$error = 'Is not a Math_Integer object.';
} elseif (!$int1->initialized()) {
$error = 'Math_Integer object is uninitalized.';
}
if (!empty($error)) {
return PEAR::raiseError($error);
} else {
return true;
}
}/*}}}*/
}/*}}} end of Math_IntegerOp */
// vim: ts=4:sw=4:et:
// vim6: fdl=1:
?>